package aceim.api.dataentity; import java.util.ArrayList; import java.util.Collections; import java.util.List; import android.os.Parcel; import android.os.Parcelable; /** * Multi-user chat room entity. Recognized as {@link Buddy}. */ public class MultiChatRoom extends Buddy{ /** * Chat participants, grouped. Thread-safe. */ private final List<BuddyGroup> groups = Collections.synchronizedList(new ArrayList<BuddyGroup>()); @Override public void writeToParcel(Parcel dest, int flags) { super.writeToParcel(dest, flags); dest.writeList(groups); } @SuppressWarnings("unchecked") public MultiChatRoom(Parcel in){ super(in); groups.addAll(in.readArrayList(BuddyGroup.class.getClassLoader())); } public MultiChatRoom(String protocolUid, String ownerUid, String serviceName, byte serviceId) { super(protocolUid, ownerUid, serviceName, serviceId); } public static final Parcelable.Creator<MultiChatRoom> CREATOR = new Parcelable.Creator<MultiChatRoom>(){ @Override public MultiChatRoom createFromParcel(Parcel source) { //Omitting classname variable used for class hierarchy parcelable support source.readString(); return new MultiChatRoom(source); } @Override public MultiChatRoom[] newArray(int size) { return new MultiChatRoom[size]; } }; /** * @return the groups */ public List<BuddyGroup> getOccupants() { return groups; } public Buddy findOccupantByUid(String uid) { if (uid != null) { synchronized (groups) { for (BuddyGroup group : groups) { synchronized (group.getBuddyList()) { for (Buddy occupant : group.getBuddyList()) { if (uid.equals(occupant.getProtocolUid())) { return occupant; } } } } } } return null; } @Override public void merge(Buddy origin){ super.merge(origin); if (origin != this && origin instanceof MultiChatRoom && origin.getProtocolUid().equals(getProtocolUid())) { synchronized (groups) { groups.clear(); groups.addAll(((MultiChatRoom)origin).getOccupants()); } } } /* (non-Javadoc) * @see java.lang.Object#toString() */ @Override public String toString() { return "MultiChatRoom [groups=" + groups + "\\n]"; } }